"""
视频类型检测器 - 第二步：确认文件类型
根据清理后的文件名特征判断是FC2、有码还是无码

作者: Claude
创建时间: 2024-09-14
"""

import re
from typing import Optional
from enum import Enum


class VideoType(Enum):
    """视频类型枚举"""
    FC2 = "FC2"
    CENSORED = "CENSORED" 
    UNCENSORED = "UNCENSORED"
    UNKNOWN = "UNKNOWN"


def detect_video_type(cleaned_filename: str) -> VideoType:
    """
    检测视频类型 - 纯函数设计，正则匹配忽略大小写
    
    :param cleaned_filename: 清理后的文件名（保持原始大小写）
    :return: 检测到的视频类型
    """
    if not cleaned_filename or len(cleaned_filename.strip()) == 0:
        return VideoType.UNKNOWN
    
    # 第一优先级：无码类型检测 (最严格：6位数字-3位数字)
    if _is_uncensored_type(cleaned_filename):
        return VideoType.UNCENSORED
    
    # 第二优先级：有码类型检测 (字母-数字格式)
    if _is_censored_type(cleaned_filename):
        return VideoType.CENSORED
    
    # 第三优先级：FC2类型检测 (剩余的数字格式)
    if _is_fc2_type(cleaned_filename):
        return VideoType.FC2
    
    # 无法识别
    return VideoType.UNKNOWN


def _is_fc2_type(filename: str) -> bool:
    """
    检测是否为FC2类型
    
    :param filename: 文件名（保持原始大小写）
    :return: 是否为FC2类型
    """
    # FC2的明显特征 - 使用忽略大小写的匹配
    fc2_indicators = [
        r'fc2[-_]?ppv',  # FC2-PPV 或 FC2PPV (忽略大小写)
        r'fc2[-_]?\d',   # FC2-数字 或 FC2数字
        r'^fc\d{7,}',    # FC开头直接跟7位以上数字
        r'^ppv[-_]?\d',  # PPV开头
    ]
    
    for pattern in fc2_indicators:
        if re.search(pattern, filename, re.IGNORECASE):
            return True
    
    # 纯数字但位数较多（7位以上）可能是FC2
    pure_number_match = re.match(r'^(\d+)(?:[-_]cd\d+)?$', filename, re.IGNORECASE)
    if pure_number_match:
        number = pure_number_match.group(1)
        if len(number) >= 7:  # 7位以上数字更可能是FC2
            return True
    
    # 7位以上数字+分段号也可能是FC2 (如3552746-1 → FC2-3552746-CD1)
    segmented_match = re.match(r'^(\d{7,})[-_](\d+)$', filename)
    if segmented_match:
        main_number = segmented_match.group(1)
        segment_number = int(segmented_match.group(2))
        # 7位以上主数字 + 合理的分段号(1-20) = FC2
        if len(main_number) >= 7 and 1 <= segment_number <= 20:
            return True
    
    return False


def _is_uncensored_type(filename: str) -> bool:
    """
    检测是否为无码类型 - 6位数字+3位数字格式
    
    :param filename: 文件名（保持原始大小写）
    :return: 是否为无码类型
    """
    # 无码的特征：支持两种格式
    uncensored_patterns = [
        r'^\d{6}[-_]\d{3}',  # 标准6位数字-3位数字格式
        r'^heyzo[-_]?(?:hd[-_]?)?\d+',  # HEYZO系列（可能包含HD标记）
        r'^caribbeancom[-_]?\d+',  # CARIBBEANCOM系列
        r'^1pon[-_]?\d+',  # 1PON系列
        r'^10musume[-_]?\d+',  # 10MUSUME系列
    ]
    
    for pattern in uncensored_patterns:
        if re.search(pattern, filename, re.IGNORECASE):
            return True
    
    return False


def _is_censored_type(filename: str) -> bool:
    """
    检测是否为有码类型 - 字母-数字格式，数字通常3-4位
    
    :param filename: 文件名（保持原始大小写）
    :return: 是否为有码类型  
    """
    # 先排除FC2格式，避免误判
    if re.match(r'^fc\d+', filename, re.IGNORECASE):
        return False
    
    # 有码的典型特征：字母-数字，数字通常3位以上
    censored_patterns = [
        r'^[a-z]{2,6}[-_]?\d{3,}',  # 2-6个字母 + 分隔符 + 3位以上数字
        r'^\d+[a-z]{2,6}[-_]?\d{3,}',  # 数字+字母系列格式（如390JNT-104）
        # 特殊已知系列（忽略数字位数限制）
        r'^ssis[-_]?\d+',
        r'^waaa[-_]?\d+',
        r'^start[-_]?\d+',
        r'^vec[-_]?\d+',
        r'^hmn[-_]?\d+',
        r'^skyhd[-_]?\d+',
    ]
    
    for pattern in censored_patterns:
        if re.search(pattern, filename, re.IGNORECASE):
            return True
    
    return False


def get_detection_confidence(cleaned_filename: str, detected_type: VideoType) -> float:
    """
    获取检测置信度
    
    :param cleaned_filename: 清理后的文件名
    :param detected_type: 检测到的类型
    :return: 置信度 (0.0-1.0)
    """
    if detected_type == VideoType.UNKNOWN:
        return 0.0
    
    filename_upper = cleaned_filename.upper()
    
    # 根据匹配的特征强度返回置信度
    if detected_type == VideoType.FC2:
        if 'FC2PPV' in filename_upper or 'FC2-PPV' in filename_upper:
            return 0.95
        elif 'PPV' in filename_upper:
            return 0.85
        elif filename_upper.startswith('FC'):
            return 0.80
        else:
            return 0.60
    
    elif detected_type == VideoType.UNCENSORED:
        if re.match(r'^\d{6}[-_]\d{3}', filename_upper):  # 标准6位-3位格式
            return 0.90
        elif re.match(r'^\d+[-_]\d+', filename_upper):     # 通用数字-数字格式
            return 0.75
        else:
            return 0.60
    
    elif detected_type == VideoType.CENSORED:
        if re.match(r'^[A-Z]{3,4}[-_]\d{3,}', filename_upper):  # 标准有码格式
            return 0.85
        else:
            return 0.70
    
    return 0.50


# 导出的公共接口
__all__ = [
    "VideoType",
    "detect_video_type", 
    "get_detection_confidence"
]